﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Dominio.Entidades;
using Dominio.Logger;
using Dominio.Logica;

namespace Interfaz
{
    public partial class RolesUsuarios : Form
    {
        private Usuarios Usuario;

        private List<Roles> ListaRoles;

        private List<Roles> ListaRolesUsuario;

        private List<Roles> ListaNoRolesUsuario;

        private AgenciaEntities ContextoBD;

        private bool HuboCambios = false;

        public RolesUsuarios()
        {
            InitializeComponent();
            cmbUsuarios.DataSource = Usuarios.RecuperarUsuariosActivos();  //trae solo los usuarios activos en la BD
            ContextoBD = Contexto.GetContexto();
        }

        private void CargarRoles()
        {
            Usuario = (Usuarios)cmbUsuarios.SelectedItem;
            ListaRoles = Roles.RecuperarRolesSistema();
            ListaRolesUsuario = Roles.RecuperarRolesUsuario(Usuario);
            ListaNoRolesUsuario = Roles.RecuperarRolesNoUsuario(Usuario);
            RefrescarListas();
        }

        private void RefrescarListas()
        {
            lstRoles.DataSource = null;
            lstRolesUsuario.DataSource = null;
            lstRoles.DataSource = ListaNoRolesUsuario;
            lstRolesUsuario.DataSource = ListaRolesUsuario;
            lblRolesRest.Text = ListaNoRolesUsuario.Count.ToString();
            lblRolesAsig.Text = ListaRolesUsuario.Count.ToString();
            CargarFuncionalidadesRol();
            CargarFuncionalidadesUsuario();
        }

        private void cmbUsuarios_SelectedIndexChanged(object sender, EventArgs e)
        {
            CargarRoles();
            CargarFuncionalidadesUsuario();
        }

        private void CargarFuncionalidadesRol()
        {
            Roles Rol = (Roles)lstRoles.SelectedItem;
            if (!(Rol == null))
            {
                lstFuncionalidadesRol.DataSource = Funcionalidades.FuncionalidadesPorRol(Rol);
            }
            else 
            {
                lstFuncionalidadesRol.DataSource = null;
            }
        }

        private void lstRoles_SelectedIndexChanged(object sender, EventArgs e)
        {
            CargarFuncionalidadesRol();
        }

        private void CargarFuncionalidadesUsuario()
        {
            List<Funcionalidades> ListaFuncionalidades = new List<Funcionalidades>();
            foreach (Roles rol in ListaRolesUsuario)
            {
                List<Funcionalidades> FuncionalidadesPorRol = Funcionalidades.FuncionalidadesPorRol(rol);
                foreach (Funcionalidades Funcionalidad in FuncionalidadesPorRol)
                {
                    if (!ListaFuncionalidades.Contains(Funcionalidad))
                        ListaFuncionalidades.Add(Funcionalidad);
                }
            }
            lstFuncionalidadesAsig.DataSource = ListaFuncionalidades;
        }

        private void btnAgregar_Click(object sender, EventArgs e)
        {
            Roles Rol = (Roles)lstRoles.SelectedItem;
            if (!(Rol == null))
            {
                ListaNoRolesUsuario.Remove(Rol);
                ListaRolesUsuario.Add(Rol);
                RefrescarListas();
                HuboCambios = true;
            }
            else
            {
                lstFuncionalidadesRol.DataSource = null;
            }
        }

        private void btnQuitar_Click(object sender, EventArgs e)
        {
            Roles Rol = (Roles)lstRolesUsuario.SelectedItem;
            if (!(Rol == null))
            {
                ListaRolesUsuario.Remove(Rol);
                ListaNoRolesUsuario.Add(Rol);
                RefrescarListas();
                HuboCambios = true;
            }
            else 
            {
                lstFuncionalidadesAsig.DataSource = null;
            }
        }

        #region BotonesAceptarCancelar
        private void btnAceptar_Click(object sender, EventArgs e)
        {
            if (HuboCambios)
            {
                GuardarCambios();
                ManejadorLog.GetLog().Grabar("OK: Se ha modificado los roles para el usuario " + cmbUsuarios.SelectedItem.ToString() + " correctamente, acción realizada por el usuario: " + Agencia.GetAgencia().UsuarioLogueado);
                MessageBox.Show("Se han guardado los cambios", "Atención", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
            }
        }

        private void btnSalir_Click(object sender, EventArgs e)
        {
            this.Dispose();
        }
        #endregion

        private void GuardarCambios()
        {
            Usuarios Usuario = (Usuarios)cmbUsuarios.SelectedItem;

            List<Roles> ListaUsuarioRolesBD = Roles.RecuperarRolesUsuario(Usuario);
            List<Roles> ListaRolesAgregar =
                (from o in ListaRolesUsuario where (!ListaUsuarioRolesBD.Contains(o)) select o).ToList();
            List<Roles> ListaRolesQuitar =
                (from o in ListaUsuarioRolesBD where (!ListaRolesUsuario.Contains(o)) select o).ToList();

            foreach (Roles RolAgregar in ListaRolesAgregar)
            {
                UsuarioRoles UsuarioRol = new UsuarioRoles();
                UsuarioRol.Usuarios = Usuario;
                UsuarioRol.Roles = RolAgregar;
                UsuarioRol.AgregarUsuarioRol();
            }

            foreach (Roles RolQuitar in ListaRolesQuitar)
            {
                UsuarioRoles UsuarioRolBorrar = UsuarioRoles.BuscarPorIdUsuarioIdRol(Usuario, RolQuitar);
                UsuarioRolBorrar.BorrarUsuarioRol();
            }

            ContextoBD.SaveChanges();
        }
    }
}
